/*
 * 此类是对XXTEA官方算法进行的封装，XXTEA信息详见http://en.wikipedia.org/wiki/XXTEA
 */

#ifndef _XXTEA_H_
#define _XXTEA_H_

#ifdef __cplusplus
extern "C"{
#endif

#ifndef XXTEA_TYPE
#define XXTEA_TYPE int         // 一种32位长的数据类型，因int在32bit和64bit系统中都是32位的，故直接用int#endif
#endif


/**
 *  @brief  根据devicekey获取xxtea的key  
 *
 *  @param key 加密的key 
 *  @param devicekey 给设备分配的key
 *  @param  len     devicekey的长度
 *  @param  isEncode    TRUE 即为加密，FALSE即为解密
 *
 *  @return  0 成功,否则失败
 */

int getDeviceKey(XXTEA_TYPE *key, const char * devicekey,unsigned int len);


/**
 *  @brief     获得输出缓冲区的长度
 *
 *  @param  nLength     输入缓冲区长度
 *  @param  isEncode    TRUE 即为加密，FALSE即为解密
 *
 *  @return 返回所需长度
 */
int XXTEAGetBufferLength(int srcLength, bool isEncode);


/**
 *  @brief  对数据流进行加密
 *
 *  @param  lpDstBuffer     目标缓冲区
 *  @param  lpSrcBuffer     源缓冲区
 *  @param  nLength     源缓冲区长度
 *  @param  lpKey   密钥 
 *
 *  @return 加密是否成功
 */
bool XXTEAEncode(char* lpDstBuffer, const char* lpSrcBuffer, int nLength, XXTEA_TYPE* lpKey);


/**
 *  @brief  对数据流进行解密
 *
 *  @param  lpDstBuffer     目标缓冲区
 *  @param  lpSrcBuffer     源缓冲区
 *  @param  nLength     源缓冲区长度
 *  @param  lpKey   密钥
 *
 *  @XXTEA_TYPE  返回解密之后的数据长度
 */
XXTEA_TYPE XXTEADecode(char* lpDstBuffer, const char* lpSrcBuffer, int nLength, XXTEA_TYPE* lpKey);

#ifdef __cplusplus
}
#endif

#endif
